<?php

require_once 'BancoDeDados.php';

class OM {

    private $cod_om;
    private $nome;
    private $sigla;
    private $vinculado;

    public function &getCod_om() {
        return $this->cod_om;
    }

    public function setCod_om($cod_om) {
        $this->cod_om = $cod_om;
    }

    public function &getNome() {
        return $this->nome;
    }

    public function setNome($nome) {
        $this->nome = $nome;
    }

    public function &getSigla() {
        return $this->sigla;
    }

    public function setSigla($sigla) {
        $this->sigla = $sigla;
    }

    public function &isVinculado() {
        return $this->vinculado;
    }

    private function setVinculado(&$vinculado) {
        $this->vinculado = &$vinculado;
    }

    public function cadastrar() {
        if ($this->validar() != 1) {
            throw new Exception("OM existente");
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('insert into om (nome, sigla) values(?,?)');
        $result = $link->execute($stmt, array($this->nome, $this->sigla));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function alterarCampo(&$campo_id, &$campo_valor) {
        if ($campo_id == 'nome' && $this->nome != $campo_valor) {
            $this->nome = &$campo_valor;
            if ($this->validar() != 1) {
                throw new Exception("OM existente");
            }
        } else if ($campo_id == 'sigla' && $this->sigla != $campo_valor) {
            $this->sigla = &$campo_valor;
        } else {
            throw new Exception('no_action');
        }
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('update om set ' . $campo_id . ' = ? where cod_om = ?');
        $result = $link->execute($stmt, array($campo_valor, $this->cod_om));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public function excluir() {
        $banco = BancoDeDados::getInstance();
        $link = $banco->getLink();
        $stmt = $link->prepare('delete from om where cod_om = ?');
        $result = $link->execute($stmt, array($this->cod_om));
        if (DB::isError($result)) {
            $link->rollBack();
            throw new Exception($result->getMessage());
        }
        $link->commit();
    }

    public static function &listar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from om order by nome');
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        $resultado = array();
        while ($result->fetchInto($row)) {
            $om = new OM();
            $om->setCod_om($row['cod_om']);
            $om->setNome($row['nome']);
            $om->setSigla($row['sigla']);
            $om->setVinculado($om->verificarVinculacao());
            $resultado[] = &$om;
            unset($om);
        }
        return $resultado;
    }

    public static function &consultar(&$cod_om) {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select * from om where cod_om = ?', array($cod_om));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        if ($result->numRows() == 0) {
            throw new Exception("OM inexistente");
        } elseif ($result->numRows() > 1) {
            throw new Exception("Mais de um OM com o mesmo identificador, informe ao administrador");
        }
        $result->fetchInto($row);
        $om = new OM();
        $om->setCod_om($row['cod_om']);
        $om->setNome($row['nome']);
        $om->setSigla($row['sigla']);
        return $om;
    }

    private function &validar() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_om from om where nome = ?', array($this->nome));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        $resultado = 1;
        if ($result->numRows() > 0) {
            $resultado = 0;
        }
        return $resultado;
    }

    private function &verificarVinculacao() {
        $banco = BancoDeDados::getInstance();
        $result = $banco->getLink()->query('select cod_om from espaco where cod_om = ?', array($this->cod_om));
        if (DB::isError($result)) {
            throw new Exception($result->getMessage());
        }
        $resultado = 0;
        if ($result->numRows() > 0) {
            $resultado = 1;
        }
        return $resultado;
    }

}
?>